package edu.usc.cssl.tacit.crawlers.senate.ui; import java.io.IOException; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; import java.util.HashMap; import java.util.LinkedHashSet; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.core.runtime.jobs.Job; import org.eclipse.jface.action.Action; import org.eclipse.jface.action.IToolBarManager; import org.eclipse.jface.dialogs.ErrorDialog; import org.eclipse.jface.dialogs.IMessageProvider; import org.eclipse.jface.layout.GridDataFactory; import org.eclipse.jface.layout.GridLayoutFactory; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.jface.viewers.ILabelProvider; import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.jface.window.Window; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.ScrolledComposite; import org.eclipse.swt.events.KeyEvent; import org.eclipse.swt.events.KeyListener; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Combo; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.DateTime; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Group; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableItem; import org.eclipse.swt.widgets.Text; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.forms.widgets.FormToolkit; import org.eclipse.ui.forms.widgets.ScrolledForm; import org.eclipse.ui.forms.widgets.Section; import org.eclipse.ui.part.ViewPart; import edu.usc.cssl.tacit.common.ui.CommonUiActivator; import edu.usc.cssl.tacit.common.ui.composite.from.TacitFormComposite; import edu.usc.cssl.tacit.common.ui.outputdata.OutputLayoutData; import edu.usc.cssl.tacit.common.ui.validation.OutputPathValidation; import edu.usc.cssl.tacit.common.ui.views.ConsoleView; import edu.usc.cssl.tacit.crawlers.senate.services.AvailableRecords; import edu.usc.cssl.tacit.crawlers.senate.services.SenateCrawler; import edu.usc.cssl.tacit.crawlers.senate.ui.internal.ISenateCrawlerViewConstants; import edu.usc.cssl.tacit.crawlers.senate.ui.internal.SenateCrawlerViewImageRegistry; public class SenateCrawlerView extends ViewPart implements ISenateCrawlerViewConstants { public static String ID = "edu.usc.cssl.tacit.crawlers.senate.ui.senatecrawlerview"; private ScrolledForm form; private FormToolkit toolkit; private OutputLayoutData outputLayout; private Combo cmbCongress; private String[] allSenators; private String[] congresses; private String[] congressYears; private Date maxDate; private Date minDate; private SimpleDateFormat format = new SimpleDateFormat("dd/MM/yyyy"); private Button dateRange; private DateTime toDate; private DateTime fromDate; private Button limitRecords; private Text limitText; private int totalSenators; private int progressSize = 100; private Button sortByDateYes; private Button sortByDateNo; private Table senatorTable; private Button removeSenatorButton; private SenatorListDialog senatorListDialog; private LinkedHashSet<String> senatorList; private ArrayList<String> selectedSenators; private Button addSenatorBtn; String previousSelectedCongress = ""; String[] availabileSenators; @Override public void createPartControl(Composite parent) { // Creates toolkit and form toolkit = createFormBodySection(parent, "Senate Crawler"); Section section = toolkit.createSection(form.getBody(), Section.TITLE_BAR | Section.EXPANDED); GridDataFactory.fillDefaults().grab(true, false).span(3, 1).applyTo(section); section.setExpanded(true); // Create a composite to hold the other widgets ScrolledComposite sc = new ScrolledComposite(section, SWT.H_SCROLL | SWT.V_SCROLL); sc.setExpandHorizontal(true); sc.setExpandVertical(true); GridLayoutFactory.fillDefaults().numColumns(3).equalWidth(false).applyTo(sc); // Creates an empty to create a empty space TacitFormComposite.createEmptyRow(toolkit, sc); // Create a composite that can hold the other widgets Composite client = toolkit.createComposite(form.getBody()); GridLayoutFactory.fillDefaults().equalWidth(true).numColumns(1).applyTo(client); // Align the composite section to one column GridDataFactory.fillDefaults().grab(true, false).span(1, 1).applyTo(client); GridLayout layout = new GridLayout();// Layout creation layout.numColumns = 2; createSenateInputParameters(client); TacitFormComposite.createEmptyRow(toolkit, client); outputLayout = TacitFormComposite.createOutputSection(toolkit, client, form.getMessageManager()); // Add run and help button on the toolbar addButtonsToToolBar(); } private void createSenateInputParameters(Composite client) { Section inputParamsSection = toolkit.createSection(client, Section.TITLE_BAR | Section.EXPANDED | Section.DESCRIPTION); GridDataFactory.fillDefaults().grab(true, false).span(1, 1).applyTo(inputParamsSection); GridLayoutFactory.fillDefaults().numColumns(3).applyTo(inputParamsSection); inputParamsSection.setText("Input Parameters"); ScrolledComposite sc = new ScrolledComposite(inputParamsSection, SWT.H_SCROLL | SWT.V_SCROLL); sc.setExpandHorizontal(true); sc.setExpandVertical(true); GridLayoutFactory.fillDefaults().numColumns(3).equalWidth(false).applyTo(sc); Composite sectionClient = toolkit.createComposite(inputParamsSection); sc.setContent(sectionClient); GridDataFactory.fillDefaults().grab(true, true).applyTo(sc); GridLayoutFactory.fillDefaults().numColumns(3).equalWidth(false).applyTo(sectionClient); inputParamsSection.setClient(sectionClient); String[] loading = {"Loading..."}; Label congressLabel = toolkit.createLabel(sectionClient, "Congress:", SWT.NONE); GridDataFactory.fillDefaults().grab(false, false).span(1, 0).applyTo(congressLabel); cmbCongress = new Combo(sectionClient, SWT.FLAT | SWT.READ_ONLY); GridDataFactory.fillDefaults().grab(true, false).span(2, 0).applyTo(cmbCongress); toolkit.adapt(cmbCongress); cmbCongress.setItems(loading); cmbCongress.select(0); Label dummy1 = new Label(sectionClient, SWT.NONE); dummy1.setText("Senator:"); GridDataFactory.fillDefaults().grab(false, false).span(1, 0) .applyTo(dummy1); senatorTable = new Table(sectionClient, SWT.BORDER | SWT.MULTI); GridDataFactory.fillDefaults().grab(true, true).span(1, 3) .hint(90, 50).applyTo(senatorTable); Composite buttonComp = new Composite(sectionClient, SWT.NONE); GridLayout btnLayout = new GridLayout(); btnLayout.marginWidth = btnLayout.marginHeight = 0; btnLayout.makeColumnsEqualWidth = false; buttonComp.setLayout(btnLayout); buttonComp.setLayoutData(new GridData(GridData.FILL_VERTICAL)); addSenatorBtn = new Button(buttonComp, SWT.PUSH); //$NON-NLS-1$ addSenatorBtn.setText("Add..."); GridDataFactory.fillDefaults().grab(false, false).span(1, 1) .applyTo(addSenatorBtn); addSenatorBtn.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { handleAdd(addSenatorBtn.getShell()); } }); addSenatorBtn.setEnabled(false); removeSenatorButton = new Button(buttonComp, SWT.PUSH); removeSenatorButton.setText("Remove..."); GridDataFactory.fillDefaults().grab(false, false).span(1, 1) .applyTo(removeSenatorButton); removeSenatorButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { for (TableItem item : senatorTable.getSelection()) { selectedSenators.remove(item.getText()); item.dispose(); } if(selectedSenators.size() == 0) { removeSenatorButton.setEnabled(false); } } }); removeSenatorButton.setEnabled(false); TacitFormComposite.createEmptyRow(toolkit, sectionClient); Group limitGroup = new Group(client, SWT.SHADOW_IN); limitGroup.setText("Limit Records"); //limitGroup.setBackground(client.getBackground()); limitGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); GridLayout limitLayout = new GridLayout(); limitLayout.numColumns = 1; limitGroup.setLayout(limitLayout); final Composite limitRecordsClient = new Composite(limitGroup, SWT.None); GridDataFactory.fillDefaults().grab(true, false).span(1,1).applyTo(limitRecordsClient); GridLayoutFactory.fillDefaults().numColumns(3).equalWidth(false).applyTo(limitRecordsClient); limitRecords = new Button(limitRecordsClient, SWT.CHECK); limitRecords.setText("Limit Records per Senator"); GridDataFactory.fillDefaults().grab(false, false).span(3, 0).applyTo(limitRecords); limitRecords.addSelectionListener(new SelectionListener() { @Override public void widgetSelected(SelectionEvent e) { if(!limitRecords.getSelection()){ form.getMessageManager().removeMessage("limitText"); } } @Override public void widgetDefaultSelected(SelectionEvent e) { // TODO Auto-generated method stub } }); final Label sortLabel = new Label(limitRecordsClient, SWT.NONE); sortLabel.setText("Sort Records by Date:"); GridDataFactory.fillDefaults().grab(false, false).span(1, 0).applyTo(sortLabel); sortLabel.setEnabled(false); sortByDateYes = new Button(limitRecordsClient, SWT.RADIO); sortByDateYes.setText("Yes"); sortByDateYes.setEnabled(false); sortByDateYes.setSelection(true); sortByDateNo = new Button(limitRecordsClient, SWT.RADIO); sortByDateNo.setText("No"); sortByDateNo.setEnabled(false); final Label limitLabel = new Label(limitRecordsClient, SWT.NONE); limitLabel.setText("No.of.Records per Senator:"); GridDataFactory.fillDefaults().grab(false, false).span(1, 0).applyTo(limitLabel); limitLabel.setEnabled(false); limitText = new Text(limitRecordsClient, SWT.BORDER); limitText.setText("1"); GridDataFactory.fillDefaults().grab(true, false).span(2, 0).applyTo(limitText); limitText.setEnabled(false); limitText.addKeyListener(new KeyListener() { @Override public void keyReleased(KeyEvent e) { if(!(e.character>='0' && e.character<='9')) { form.getMessageManager() .addMessage( "limitText", "Provide valid no.of.records per senator", null, IMessageProvider.ERROR); limitText.setText(""); } else { form.getMessageManager().removeMessage("limitText"); } } @Override public void keyPressed(KeyEvent e) { // TODO Auto-generated method stub } }); TacitFormComposite.createEmptyRow(toolkit, client); Group dateGroup = new Group(client, SWT.SHADOW_IN); dateGroup.setText("Date"); dateGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); GridLayout layout = new GridLayout(); layout.numColumns = 1; dateGroup.setLayout(layout); dateRange = new Button(dateGroup, SWT.CHECK); dateRange.setText("Specify Date Range"); //TacitFormComposite.createEmptyRow(toolkit, group); final Composite dateRangeClient = new Composite(dateGroup, SWT.None); GridDataFactory.fillDefaults().grab(true, false).span(1,1).applyTo(dateRangeClient); GridLayoutFactory.fillDefaults().numColumns(4).equalWidth(false).applyTo(dateRangeClient); dateRangeClient.setEnabled(false); dateRangeClient.pack(); final Label fromLabel = new Label(dateRangeClient, SWT.NONE); fromLabel.setText("From:"); GridDataFactory.fillDefaults().grab(false, false).span(1, 0).applyTo(fromLabel); fromDate = new DateTime(dateRangeClient, SWT.DATE | SWT.DROP_DOWN | SWT.BORDER); GridDataFactory.fillDefaults().grab(false, false).span(1, 0).applyTo(fromDate); fromLabel.setEnabled(false); fromDate.setEnabled(false); fromDate.addListener(SWT.Selection, new Listener() { @Override public void handleEvent(Event event) { int day = fromDate.getDay(); int month = fromDate.getMonth() + 1; int year = fromDate.getYear(); Date newDate = null; try { newDate = format.parse(day + "/" + month + "/" + year); } catch (ParseException e) { e.printStackTrace(); } if(newDate.before(minDate) || newDate.after(maxDate)) { Calendar cal = Calendar.getInstance(); cal.setTime(minDate); fromDate.setMonth(cal.get(Calendar.MONTH)); fromDate.setDay(cal.get(Calendar.DAY_OF_MONTH)); fromDate.setYear(cal.get(Calendar.YEAR)); } } }); final Label toLabel = new Label(dateRangeClient, SWT.NONE); toLabel.setText("To:"); GridDataFactory.fillDefaults().grab(false, false).span(1, 0).applyTo(toLabel); toDate = new DateTime(dateRangeClient, SWT.DATE | SWT.DROP_DOWN | SWT.BORDER); GridDataFactory.fillDefaults().grab(false, false).span(1, 0).applyTo(toDate); toLabel.setEnabled(false); toDate.setEnabled(false); toDate.addListener(SWT.Selection, new Listener() { @Override public void handleEvent(Event event) { int day = toDate.getDay(); int month = toDate.getMonth() + 1; int year = toDate.getYear(); Date newDate = null; try { newDate = format.parse(day + "/" + month + "/" + year); } catch (ParseException e) { e.printStackTrace(); } if(newDate.after(maxDate) || newDate.before(minDate)) { Calendar cal = Calendar.getInstance(); cal.setTime(maxDate); toDate.setMonth(cal.get(Calendar.MONTH)); toDate.setDay(cal.get(Calendar.DAY_OF_MONTH)); toDate.setYear(cal.get(Calendar.YEAR)); } } }); Job loadFieldValuesJob = new Job("Loading form field values") { HashMap<String, String> congressDetails = null; final ArrayList<String> tempCongress = new ArrayList<String>(); final ArrayList<String> tempCongressYears = new ArrayList<String>(); @Override protected IStatus run(IProgressMonitor monitor) { try { congressDetails = AvailableRecords.getAllCongresses(); } catch (IOException e) { e.printStackTrace(); } Display.getDefault().syncExec(new Runnable() { @Override public void run() { cmbCongress.removeAll(); for(String key : congressDetails.keySet()) { tempCongress.add(key); String value = congressDetails.get(key); tempCongressYears.add(value); cmbCongress.add(key+" ("+ value+ ")"); if(key.equalsIgnoreCase("All")) { String[] tempYears = value.split("-"); Calendar cal = Calendar.getInstance(); cal.set(Integer.parseInt(tempYears[0]), 0, 1); minDate = cal.getTime(); fromDate.setMonth(cal.get(Calendar.MONTH)); fromDate.setDay(cal.get(Calendar.DAY_OF_MONTH)); fromDate.setYear(cal.get(Calendar.YEAR)); cal.set(Integer.parseInt(tempYears[1]), 11, 31); toDate.setMonth(cal.get(Calendar.MONTH)); toDate.setDay(cal.get(Calendar.DAY_OF_MONTH)); toDate.setYear(cal.get(Calendar.YEAR)); maxDate = cal.getTime(); } } //cmbCongress.setItems(congresses); cmbCongress.select(0); }}); congresses = tempCongress.toArray(new String[0]); congressYears = tempCongressYears.toArray(new String[0]); try { allSenators = AvailableRecords.getAllSenators(congresses); totalSenators = allSenators.length + 5; Display.getDefault().syncExec(new Runnable() { @Override public void run() { addSenatorBtn.setEnabled(true); } }); } catch (IOException e2) { e2.printStackTrace(); } return Status.OK_STATUS; } }; //loadFieldValuesJob.setUser(true); loadFieldValuesJob.schedule(); cmbCongress.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { // set dates String tempYears[] = congressYears[cmbCongress.getSelectionIndex()].split("-"); Calendar cal = Calendar.getInstance(); cal.set(Integer.parseInt(tempYears[0]), 0, 1); minDate = cal.getTime(); fromDate.setMonth(cal.get(Calendar.MONTH)); fromDate.setDay(cal.get(Calendar.DAY_OF_MONTH)); fromDate.setYear(cal.get(Calendar.YEAR)); cal.set(Integer.parseInt(tempYears[1]), 11, 31); toDate.setMonth(cal.get(Calendar.MONTH)); toDate.setDay(cal.get(Calendar.DAY_OF_MONTH)); toDate.setYear(cal.get(Calendar.YEAR)); maxDate = cal.getTime(); //cmbSenator.select(0); //Empty the senatorTable senatorTable.removeAll(); selectedSenators = new ArrayList<String>(); } }); dateRange.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { if (dateRange.getSelection()) { dateRangeClient.setEnabled(true); fromLabel.setEnabled(true); fromDate.setEnabled(true); toLabel.setEnabled(true); toDate.setEnabled(true); } else { dateRangeClient.setEnabled(false); fromLabel.setEnabled(false); fromDate.setEnabled(false); toLabel.setEnabled(false); toDate.setEnabled(false); } } }); limitRecords.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { if (limitRecords.getSelection()) { sortByDateYes.setEnabled(true); sortByDateNo.setEnabled(true); sortLabel.setEnabled(true); limitLabel.setEnabled(true); limitText.setEnabled(true); } else { sortByDateYes.setEnabled(false); sortByDateNo.setEnabled(false); sortLabel.setEnabled(false); limitLabel.setEnabled(false); limitText.setEnabled(false); } } }); } static class ArrayLabelProvider extends LabelProvider { @Override public String getText(Object element) { return (String) element; } } public void processElementSelectionDialog(Shell shell) { ILabelProvider lp = new ArrayLabelProvider(); senatorListDialog = new SenatorListDialog(shell, lp); senatorListDialog.setTitle("Select the Authors from the list"); senatorListDialog.setMessage("Enter Author name to search"); } private void handleAdd(Shell shell) { processElementSelectionDialog(shell); senatorList = new LinkedHashSet<String>(); Job listSenators = new Job("Retrieving senator list ...") { String selectedCongress = ""; @Override protected IStatus run(IProgressMonitor monitor) { senatorList.clear(); Display.getDefault().syncExec(new Runnable() { @Override public void run() { selectedCongress = congresses[cmbCongress.getSelectionIndex()]; } }); try { ArrayList<String> temp = new ArrayList<String>(); temp.add(0, "All Senators"); temp.add(1, "All Democrats"); temp.add(2, "All Republicans"); temp.add(3, "All Independents"); if(selectedCongress.equals("All")) { for(String s : allSenators) temp.add(s); } else { if(previousSelectedCongress.isEmpty() || !previousSelectedCongress.equals(selectedCongress)) { availabileSenators = AvailableRecords.getSenators(selectedCongress); } for(String s : availabileSenators) temp.add(s); } senatorList.addAll(temp); if (selectedSenators != null) senatorList.removeAll(selectedSenators); Display.getDefault().asyncExec(new Runnable() { @Override public void run() { senatorListDialog.refresh(senatorList.toArray()); } }); previousSelectedCongress = selectedCongress; } catch (final IOException exception) { ConsoleView.printlInConsole(exception.toString()); Display.getDefault().syncExec(new Runnable() { @Override public void run() { ErrorDialog.openError(Display.getDefault() .getActiveShell(), "Problem Occurred", "Please Check your connectivity to server", new Status(IStatus.ERROR, CommonUiActivator.PLUGIN_ID, "Network is not reachable")); } }); } return Status.OK_STATUS; } }; listSenators.schedule(); senatorList.add("Loading..."); senatorListDialog.setElements(senatorList.toArray()); senatorListDialog.setMultipleSelection(true); if (senatorListDialog.open() == Window.OK) { updateSenatorTable(senatorListDialog.getResult()); } } private void updateSenatorTable(Object[] result) { if (selectedSenators == null) { selectedSenators = new ArrayList<String>(); } for (Object object : result) { selectedSenators.add((String) object); } //Collections.sort(selectedSenators); senatorTable.removeAll(); for (String itemName : selectedSenators) { TableItem item = new TableItem(senatorTable, 0); item.setText(itemName); if(!removeSenatorButton.isEnabled()) { removeSenatorButton.setEnabled(true); } } } /** * Adds "Classify" and "Help" buttons on the Naive Bayes Classifier form */ private void addButtonsToToolBar() { IToolBarManager mgr = form.getToolBarManager(); mgr.add(new Action() { @Override public ImageDescriptor getImageDescriptor() { return (SenateCrawlerViewImageRegistry.getImageIconFactory().getImageDescriptor(IMAGE_LRUN_OBJ)); } @Override public String getToolTipText() { return "Crawl"; } String dateFrom = ""; String dateTo = ""; int maxDocs = -1; String sortType = "Default"; String congressNum = "-1"; ArrayList<String> senatorDetails = new ArrayList<String>(); String outputDir = ""; private boolean canProceed; @Override public void run() { final SenateCrawler sc = new SenateCrawler(); final Job job = new Job("Senate Crawler") { @Override protected IStatus run(IProgressMonitor monitor) { TacitFormComposite.setConsoleViewInFocus(); TacitFormComposite.updateStatusMessage(getViewSite(), null,null, form); Display.getDefault().syncExec(new Runnable() { @Override public void run() { if(congresses[cmbCongress.getSelectionIndex()].indexOf("All")!=-1) { congressNum = "-1"; } else { congressNum = congresses[cmbCongress.getSelectionIndex()]; } senatorDetails = selectedSenators; if (dateRange.getSelection()) { dateFrom = (fromDate.getMonth()+1)+"/"+fromDate.getDay()+"/"+fromDate.getYear(); dateTo = (toDate.getMonth()+1)+"/"+toDate.getDay()+"/"+toDate.getYear(); } else { dateFrom = ""; dateTo = ""; } if(limitRecords.getSelection()) { //sort by date : begining sortType = sortByDateNo.getSelection() ? "Default" : "Date"; maxDocs = Integer.parseInt(limitText.getText()); } else { maxDocs = -1; sortType = "Date"; } outputDir = outputLayout.getOutputLabel().getText(); } }); if(senatorDetails.contains("All Senators") && congressNum.equals("-1")) { // all senators and all congresses progressSize = (totalSenators * congresses.length) + 50; } else { int count = 1; if(congressNum.equals("-1")) { if(senatorDetails.contains("All Democrats")) { progressSize = (20 * congresses.length) + 50; // on an average of 20 democrats count++; } if(senatorDetails.contains("All Republicans")) { progressSize+= (20 * congresses.length) + 50; count++; } if(senatorDetails.contains("All Independents")) { progressSize+= (20 * congresses.length) + 50; count++; } progressSize+= ((senatorDetails.size() - count)+1 * congresses.length) + 50; // considering none of "All" selected } else { if(senatorDetails.contains("All Democrats")) { progressSize = 100 + 50; // on an average of 20 democrats count++; } if(senatorDetails.contains("All Republicans")) { progressSize+= 100 + 50; count++; } if(senatorDetails.contains("All Independents")) { progressSize+= 100 + 50; count++; } progressSize+= ((senatorDetails.size() - count)+1 * 10) + 50; // considering none of "All" selected } } monitor.beginTask("Running Senate Crawler..." , progressSize); TacitFormComposite.writeConsoleHeaderBegining("Senate Crawler started "); final ArrayList<Integer> allCongresses = new ArrayList<Integer>(); for(String s: congresses) { if(!s.contains("All")) allCongresses.add(Integer.parseInt(s)); } if(monitor.isCanceled()) { TacitFormComposite.writeConsoleHeaderBegining("<terminated> Senate Crawler"); return handledCancelRequest("Cancelled"); } try { monitor.subTask("Initializing..."); monitor.worked(10); if(monitor.isCanceled()) { TacitFormComposite.writeConsoleHeaderBegining("<terminated> Senate Crawler"); return handledCancelRequest("Cancelled"); } sc.initialize(sortType, maxDocs, Integer.parseInt(congressNum), senatorDetails, dateFrom, dateTo, outputDir, allCongresses, monitor, progressSize - 30); if(monitor.isCanceled()) { TacitFormComposite.writeConsoleHeaderBegining("<terminated> Senate Crawler"); return handledCancelRequest("Cancelled"); } monitor.worked(10); monitor.subTask("Crawling..."); if(monitor.isCanceled()) { TacitFormComposite.writeConsoleHeaderBegining("<terminated> Senate Crawler"); return handledCancelRequest("Cancelled"); } sc.crawl(); if(monitor.isCanceled()) { TacitFormComposite.writeConsoleHeaderBegining("<terminated> Senate Crawler"); return handledCancelRequest("Cancelled"); } monitor.worked(10); } catch (NumberFormatException e) { return handleException(monitor, e, "Crawling failed. Provide valid data"); } catch (IOException e) { return handleException(monitor, e, "Crawling failed. Provide valid data"); } catch(Exception e) { return handleException(monitor, e, "Crawling failed. Provide valid data"); } monitor.worked(100); monitor.done(); ConsoleView.printlInConsoleln("Senate crawler completed successfully."); ConsoleView.printlInConsoleln("Total no.of.files downloaded : " + sc.totalFilesDownloaded); ConsoleView.printlInConsoleln("Done"); TacitFormComposite.updateStatusMessage(getViewSite(), "Senate crawler completed successfully.", IStatus.OK, form); return Status.OK_STATUS; } }; job.setUser(true); canProceed = canItProceed(); if(canProceed) { job.schedule(); // schedule the job } } }); Action helpAction = new Action() { @Override public ImageDescriptor getImageDescriptor() { return (SenateCrawlerViewImageRegistry.getImageIconFactory().getImageDescriptor(IMAGE_HELP_CO)); } @Override public String getToolTipText() { return "Help"; } @Override public void run() { PlatformUI .getWorkbench() .getHelpSystem() .displayHelp( "edu.usc.cssl.tacit.crawlers.senate.ui.senate"); }; }; mgr.add(helpAction); PlatformUI .getWorkbench() .getHelpSystem() .setHelp(helpAction, "edu.usc.cssl.tacit.crawlers.senate.ui.senate"); PlatformUI .getWorkbench() .getHelpSystem() .setHelp(form, "edu.usc.cssl.tacit.crawlers.senate.ui.senate"); form.getToolBarManager().update(true); } private IStatus handleException(IProgressMonitor monitor, Exception e, String message) { monitor.done(); System.out.println(message); e.printStackTrace(); TacitFormComposite.updateStatusMessage(getViewSite(), message, IStatus.ERROR, form); TacitFormComposite.writeConsoleHeaderBegining("<terminated> Senate Crawler"); return Status.CANCEL_STATUS; } private IStatus handledCancelRequest(String message) { TacitFormComposite.updateStatusMessage(getViewSite(), message, IStatus.ERROR, form); TacitFormComposite.writeConsoleHeaderBegining("<terminated> Senate Crawler"); return Status.CANCEL_STATUS; } private boolean canItProceed() { if(limitRecords.getSelection()) { if(limitText.getText().isEmpty()) { form.getMessageManager() .addMessage( "limitText", "Provide valid no.of.records per senator", null, IMessageProvider.ERROR); return false; } } String message = OutputPathValidation.getInstance().validateOutputDirectory(outputLayout.getOutputLabel().getText(), "Output"); if (message != null) { message = outputLayout.getOutputLabel().getText() + " " + message; form.getMessageManager().addMessage("output", message, null,IMessageProvider.ERROR); return false; } else { form.getMessageManager().removeMessage("output"); } return true; }; @Override public void setFocus() { form.setFocus(); } /** * * @param parent * @param title * @return - Creates a form body section for Naive Bayes Classifier */ private FormToolkit createFormBodySection(Composite parent, String title) { // Every interface requires a toolkit(Display) and form to store the components FormToolkit toolkit = new FormToolkit(parent.getDisplay()); form = toolkit.createScrolledForm(parent); toolkit.decorateFormHeading(form.getForm()); form.setText(title); GridLayoutFactory.fillDefaults().numColumns(1).equalWidth(true) .applyTo(form.getBody()); return toolkit; } }